package com.zzh.wechatpay.service.impl;

import com.zzh.wechatpay.config.WeChatConfig;
import com.zzh.wechatpay.domain.User;
import com.zzh.wechatpay.mapper.UserMapper;
import com.zzh.wechatpay.service.UserService;
import com.zzh.wechatpay.utils.HttpUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

/**
 * 用户服务类实现
 *
 * @author zzh
 */
@Service
public class UserServiceImpl implements UserService {


    @Autowired
    private WeChatConfig weChatConfig;


    @Resource
    private UserMapper userMapper;


    @Override
    public User saveWeChatUser(String code) {
        //获取access_token
        String tokenUrl = String.format(WeChatConfig.getGetTokenUrl(), weChatConfig.getOpenAppid(), weChatConfig.getAppsecret(), code);
        Map<String, Object> accessTokenMap = HttpUtils.doGet(tokenUrl);
        /**
         * 微信获取access_token后返回的数据,有效期二个小时,可以刷新access_token有效期(见微信文档):
         *
         * access_token	接口调用凭证
         * expires_in	access_token接口调用凭证超时时间，单位（秒）
         * refresh_token	用户刷新access_token
         * openid	授权用户唯一标识
         * scope	用户授权的作用域，使用逗号（,）分隔
         * unionid	当且仅当该网站应用已获得该用户的userinfo授权时，才会出现该字段。
         */
        String openId = (String) accessTokenMap.get("openid");
        String accessToken = (String) accessTokenMap.get("access_token");
        //根据openId去查询数据库,用户存在(更新用户头像)，直接返回
        User dbUser = userMapper.findByopenid(openId);
        if (dbUser != null) {
            return dbUser;
        }
        //用户不存在,获取用户个人信息,新建用户到数据库
        String userInfoUrl = String.format(WeChatConfig.getUserInfoUrl(), accessToken, weChatConfig.getOpenAppid());
        Map<String, Object> userInfoMap = HttpUtils.doGet(userInfoUrl);
        /**
         * 获取用户个人信息后的返回值说明:
         *
         * openid	普通用户的标识，对当前开发者帐号唯一
         * nickname	普通用户昵称
         * sex	普通用户性别，1为男性，2为女性
         * province	普通用户个人资料填写的省份
         * city	普通用户个人资料填写的城市
         * country	国家，如中国为CN
         * headimgurl	用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空
         * privilege	用户特权信息，json数组，如微信沃卡用户为（chinaunicom）
         * unionid	用户统一标识。针对一个微信开放平台帐号下的应用，同一用户的unionid是唯一的。
         */

        if (userInfoMap == null || userInfoMap.isEmpty()) {
            return null;
        }
        String nickname = (String) userInfoMap.get("nickname");
        Double sexTemp = (Double) userInfoMap.get("sex");
        int sex = sexTemp.intValue();
        String province = (String) userInfoMap.get("province");
        String city = (String) userInfoMap.get("city");
        String country = (String) userInfoMap.get("country");
        String headimgurl = (String) userInfoMap.get("headimgurl");
        String finalAddress = country + "||" + province + "||" + city;
        //解决乱码
        nickname = new String(nickname.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        finalAddress = new String(finalAddress.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        User user = new User();
        user.setName(nickname);
        user.setHeadImg(headimgurl);
        user.setCity(finalAddress);
        user.setOpenid(openId);
        user.setSex(sex);
        user.setCreateTime(new Date());
        userMapper.save(user);
        return user;
    }
}
